1.CurveFS提供的成本优势 为了高可靠,ES如果使用本地盘的话一般会使用两副本,也就是说存储1PB数据需要2PB的物理空间。但是如果使用CurveFS,由于CurveFS的后端可以对接S3,所以可以利用对象存储提供的EC能力,既保证了可靠性,又可以减少副本数量,从而达到了降低成本的目的。
Curve 文件存储在 Elasticsearch 冷热数据存储中的应用实践
作者简介
顾贤杰
网易系统运维专家,杭研SA&SRE团队负责人
吴宏松
Curve Maintainer
ES 使用 CurveFS 的收益
以网易对象存储这边当前主流的EC 20+4使用为例,该使用方式就相当于是1.2副本。所以如果以ES需要1PB使用空间为例,那么使用CurveFS+1.2副本对象存储只需要1.2PB空间,相比本地盘2副本可以节省800TB左右的容量,成本优化效果非常显著。
而使用CurveFS后的新模式下基本上只要对freeze的索引进行unfreeze,让对应节点的ES将对应的meta数据载入内存就可以执行索引,大概耗时仅需30S左右,相比直接用S3存储冷数据有数量级的下降。
3.CurveFS提供的容量优势 本地盘的容量是有限的,而CurveFS的空间容量可以在线无限扩展。同时减少了本地存储的维护代价。
4.CurveFS提供的易运维优势 ES使用本地盘以及使用S3插件方式,当需要扩容或者节点异常恢复时,需要增加人力运维成本。CurveFS实现之初的一个目标就是易运维,所以CurveFS可以实现数条命令的快速部署以及故障自愈能力。
选用 CurveFS 的原因
背景:在生产环境有大量的场景会用到ES做文档、日志存储后端,因为ES优秀的全文检索能力在很多时候可以大大的简化相关系统设计的复杂度。比较常见的为日志存储,链路追踪,甚至是监控指标等场景都可以用ES来做。
运维成本。ES节点升级的时候需要额外卸载安装S3插件,有一定的运维成本。
性能瓶颈。自己私有化搭建的Minio随着bucket里面数据量的增长,数据存储和抽取都会成为一个很大的问题
稳定性问题。在内部搭建的Minio集群在做数据restore的时候,因为文件处理性能等因素,经常遇到访问超时等场景,所以一直在关注是否有相关的系统可以提供更好的读写稳定性。
由于S3协议经过多年的演化,已经成了对象存储的工业标准。很多人都有想过用fuse的方式使用S3的存储能力。事实上基于S3的文件系统有很多款,例如开源的s3fs-fuse、ossfs、RioFS、CurveFS等。
在通过实际调研以及大量的测试后,基于Curve的性能(尤其是元数据方面,CurveFS是基于RAFT一致性协议自研的元数据引擎,与其他没有元数据引擎的S3文件系统(比如s3fs,ossfs)相比具备巨大的性能优势),易运维,稳定性,Curve可以同时提供块存储以及文件存储能力等能力以及Curve活跃的开源氛围,最终选用了CurveFS。
CurveFS 结合 ES 的实践
Curve是什么,CurveFS是一个基于 Fuse实现的兼容POSIX 接口的分布式文件系统,架构如下图所示:
1. 客户端curve-fuse,和元数据集群交互处理文件元数据增删改查请求,和数据集群交互处理文件数据的增删改查请求。
2. 元数据集群metaserver cluster,用于接收和处理元数据(inode和dentry)的增删改查请求。metaserver cluster的架构和CurveBS类似,具有高可靠、高可用、高可扩的特点:MDS用于管理集群拓扑结构,资源调度。metaserver是数据节点,一个metaserver对应管理一个物理磁盘。CurveFS使用Raft保证元数据的可靠性和可用性,Raft复制组的基本单元是copyset。一个metaserver上包含多个copyset复制组。
3. 数据集群data cluster,用于接收和处理文件数据的增删改查。data cluster目前支持两存储类型:支持S3接口的对象存储以及CurveBS(开发中)。
ES使用CurveFS,CurveFS定位于网易运维的云原生系统,所以其部署是简单快速的,通过CurveAdm工具,只需要几条命令便可以部署起CurveFS的环境,具体部署见[1][2];部署后效果如下图:
在日志存储场景,改造是完全基于历史的服务器做的在线改造。下图是线上日志的一个存储架构示例,node0到node5可以认为是热存储节点,机器为12*4T,128G的存储机型,每个节点跑3个ES实例,每个实例32G内存,4块独立盘。node6到node8为12*8T的存储机型,3台服务器跑一个Minio集群,每台机器上的ES实例不做数据本地写。
可以看到主要的改造重点是将node6到node8,3个节点进行ES的配置改造,其中以node6节点的配置为例:
cluster.name: ops-elk
node.name: ${HOSTNAME}
network.host: [_local_,_bond0_]
http.host: [_local_]
discovery.zen.minimum_master_nodes: 1
action.auto_create_index: true
transport.tcp.compress: true
indices.fielddata.cache.size: 20%
path.data: /home/nbs/elk/data1/data
path.logs: /home/nbs/elk/data1/logs
- /curvefs/mnt1
xpack.ml.enabled: false
xpack.monitoring.enabled: false
discovery.zen.ping.unicast.hosts: ["ops-elk1:9300","ops-elk7:9300","ops-elk
7:9300","ops-elk8.jdlt.163.org:9300"]
node.attr.box_type: cold
ES设置,除了底层配置外,很重要的一点就是调整index索引的设置。这块的设置难度不高,要点是:
1. 对应索引设置数据分配依赖和aliases
其实在新节点开放数据存储后,如果没有亲和性设置,集群马上会启动relocating操作。因此建议对存量的索引新增routing.alloction.require的设置来避免热数据分配到CurveFS存储节点。针对每天新增索引,建议加入以下这样的index template配置。
{
"template": {
"settings": {
"index": {
"lifecycle": {
"name": "syslog",
"rollover_alias": "syslog"
},
"routing": {
"allocation": {
"require": {
"box_type": "hot"
}
}
},
"number_of_shards": "10",
"translog": {
"durability": "async"
}
}
},
"aliases": {
"syslog": {}
},
"mappings": {}
}
}
1. routing部分要指定新索引写到热数据节点
冷数据的切换,可以在kibana的index_lifecycle_management管理页面设置。针对上面的syslog场景,hot部分设置如下图,其余基本默认的就可以了。
在索引周期管理配置页面中,除了设置hot phase,还可以设置warm phase,在warm phase可以做一些shrink,force merge等操作,日志存储场景我们直接做hot到cold的处理逻辑。
从技术上讲,日志存储类型的业务,底层索引一旦完成写后基本不做再次的数据更改,设置索引副本数量主要是为了应对分布式系统节点宕机等异常场景的数据恢复。如果存储层面有更可靠的方式,那么自然而然可以将es的副本数量调整为0。因此杭研云计算存储团队研发的一款基于S3后端的存储文件系统CurveFS,自然而然进入了冷数据选型的视野。从技术上讲内部S3存储基于EC纠删码的实现,通过降低es的副本数量为0,可以明显的降低对存储空间的使用需求。
后续规划
Curve文件存储后端完全支持Curve块存储,满足一些场景下对性能的需求。预计2023 Q1发布。
Curve文件存储支持生命周期管理,支持用户自定义数据冷热,数据按需存储在不同集群中。预计2023 Q2发布。
Curve完全支持云原生部署。当前客户端已经支持CSI,集群的部署支持预计2023 Q2发布。
参考[1]:
https://github.com/opencurve/curveadm/wiki/curvefs-cluster-deployment
参考[2]:
https://github.com/opencurve/curveadm/wiki/curvefs-client-deployment
关于 Curve
Curve 是一款高性能、易运维、云原生的开源分布式存储系统。可应用于主流的云原生基础设施平台:对接 OpenStack 平台为云主机提供高性能块存储服务;对接 Kubernetes 为其提供 RWO、RWX 等类型的持久化存储卷;对接 PolarFS 作为云原生数据库的高性能存储底座,完美支持云原生数据库的存算分离架构。Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。
GitHub:https://github.com/opencurve/curve 官网:https://opencurve.io/ 用户论坛:https://ask.opencurve.io/ 微信群:搜索群助手微信号 OpenCurve_bot